import { db } from '../client';
import { sysUser, sysRole, sysUserRole } from '../schema/index';
import { eq, and } from 'drizzle-orm';
import * as bcrypt from 'bcrypt';

/**
 * 创建管理员账号
 */
async function seedAdmin() {
  console.log('🌱 开始创建初始管理员账号...\n');

  const username = 'admin';
  const password = 'admin123';
  const adminRoleCode = 'admin';

  try {
    // 1. 检查管理员账号是否已存在
    const [existingUser] = await db
      .select()
      .from(sysUser)
      .where(eq(sysUser.username, username))
      .limit(1);

    if (existingUser) {
      console.log('⚠️  管理员账号已存在，跳过创建');
      console.log(`   账号：${username}`);
      console.log(`   ID：${existingUser.id}\n`);
      return;
    }

    // 2. 加密密码
    const hashedPassword = await bcrypt.hash(password, 10);

    // 3. 创建管理员账号
    const [admin] = await db
      .insert(sysUser)
      .values({
        username,
        password: hashedPassword,
        nickname: '系统管理员',
        status: 1,
        description: '默认管理员账号，请在生产环境中立即修改密码',
      })
      .returning();

    console.log('✅ 管理员账号创建成功！');
    console.log(`   账号：${username}`);
    console.log(`   密码：${password}`);
    console.log(`   ID：${admin.id}\n`);

    // 4. 检查并创建管理员角色
    let adminRole = await db
      .select()
      .from(sysRole)
      .where(eq(sysRole.code, adminRoleCode))
      .limit(1)
      .then((roles) => roles[0]);

    if (!adminRole) {
      console.log('🌱 创建管理员角色...');
      const [role] = await db
        .insert(sysRole)
        .values({
          code: adminRoleCode,
          name: '系统管理员',
          status: 1,
          description: '系统管理员角色，拥有所有权限',
        })
        .returning();
      adminRole = role;
      console.log(`✅ 管理员角色创建成功！`);
      console.log(`   角色编码：${adminRoleCode}`);
      console.log(`   角色ID：${adminRole.id}\n`);
    } else {
      console.log('⚠️  管理员角色已存在，跳过创建');
      console.log(`   角色编码：${adminRoleCode}`);
      console.log(`   角色ID：${adminRole.id}\n`);
    }

    // 5. 为管理员分配角色
    const existingUserRole = await db
      .select()
      .from(sysUserRole)
      .where(and(eq(sysUserRole.userId, admin.id), eq(sysUserRole.roleId, adminRole.id)))
      .limit(1)
      .then((roles: typeof sysUserRole.$inferSelect[]) => roles[0]);

    if (!existingUserRole) {
      console.log('🌱 为管理员分配角色...');
      await db.insert(sysUserRole).values({
        userId: admin.id,
        roleId: adminRole.id,
        createdBy: admin.id,
      });
      console.log('✅ 角色分配成功！\n');
    } else {
      console.log('⚠️  管理员已拥有该角色，跳过分配\n');
    }

    console.log('📋 管理员账号信息：');
    console.log(`   用户名：${username}`);
    console.log(`   密码：${password}`);
    console.log(`   角色：${adminRole.name} (${adminRoleCode})`);
    console.log(`   ⚠️  提示：请在生产环境中立即修改密码！\n`);
  } catch (error) {
    console.error('❌ 创建管理员账号失败：', error);
    throw error;
  }
}

// 执行种子数据
seedAdmin()
  .then(() => {
    console.log('✅ 种子数据创建完成');
    process.exit(0);
  })
  .catch((error) => {
    console.error('❌ 种子数据创建失败：', error);
    process.exit(1);
  });

